import re

from flask import g, redirect, url_for, jsonify, request, current_app

from ihome.modules.api import api_blu
from ihome.utils.common import user_login_data, upload_file
from ihome.utils.response_code import RET, error_map



# 用户中心
# 获取用户信息
@api_blu.route('/user')
@user_login_data # userinfo = user_login_data(userinfo)
def userinfo():
    # 判断用户是否登录
    user = g.user
    if not user:  # 用户未登录, 重定向到前台首页
        return redirect(url_for("html.index"))

    return jsonify(errno=RET.OK, errmsg=error_map[RET.OK], data = user.to_dict())

# 用户名修改
@api_blu.route('/user/name', methods=['POST'])
@user_login_data
def user_name():
    # 判断用户是否登录
    user = g.user
    if not user:  # 用户未登录, 重定向到前台首页
        return redirect(url_for("html.index"))

    # 获取参数
    name = request.json.get("name")

    # 校验参数
    if not name:
        return jsonify(errno=RET.PARAMERR, errmsg=error_map[RET.PARAMERR])

    # 数据库行为
    try:
        user.name = name
    except BaseException as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg=error_map[RET.DBERR])

    # json形式返回数据
    return jsonify(errno=RET.OK, errmsg=error_map[RET.OK])


# 上传个人头像
@api_blu.route('/user/avatar', methods=['POST'])
@user_login_data
def user_avatar():
    # 判断用户是否登录
    user = g.user
    if not user:  # 用户未登录, 重定向到前台首页
        return redirect(url_for("html.index"))

    # 获取参数
    avatar_file = request.files.get("avatar")

    # 校验参数
    if not avatar_file:
        return jsonify(errno=RET.PARAMERR, errmsg=error_map[RET.PARAMERR])

    # 读取上传文件的二进制数据
    try:
        img_bytes = avatar_file.read()
    except BaseException as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.PARAMERR, errmsg=error_map[RET.PARAMERR])

    # 使用七牛云上传文件
    try:
        file_name = upload_file(img_bytes)
    except BaseException as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.THIRDERR, errmsg=error_map[RET.THIRDERR])

    # 数据库行为
    try:
        user.avatar_url = file_name
    except BaseException as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg=error_map[RET.DBERR])

    data = {
        "avatar_url": user.to_dict()["avatar_url"]
    }
    # json形式返回数据
    return jsonify(errno=RET.OK, errmsg=error_map[RET.OK], data = data)


# 获取与设置用户实名信息
@api_blu.route('/user/auth', methods= ['POST', 'GET'])
@user_login_data
def user_auth():
    # 判断用户是否登录
    user = g.user
    if not user:  # 用户未登录, 重定向到前台首页
        return redirect(url_for("html.index"))

    if request.method == "GET":
        # 数据库行为
        id_card = None
        real_name =None
        try:
            id_card =user.id_card
            real_name = user.real_name
        except BaseException as e:
            current_app.logger.error(e)
            return jsonify(errno=RET.DBERR, errmsg=error_map[RET.DBERR])

        data = {"real_name":real_name,
                "id_card":id_card
                }

        return jsonify(errno=RET.OK, errmsg=error_map[RET.OK], data= data)

    # 获取参数
    real_name = request.json.get('real_name')
    id_card = request.json.get('id_card')

    # 校验参数
    if not all([real_name, id_card]):
        return jsonify(errno=RET.PARAMERR, errmsg=error_map[RET.PARAMERR])

    if not re.match(r'^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$',id_card):
        return jsonify(errno=RET.PARAMERR, errmsg=error_map[RET.PARAMERR])

    try:
        id_card = int(id_card)
    except BaseException as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.PARAMERR, errmsg=error_map[RET.PARAMERR])


    # 数据库行为
    try:
        user.real_name = real_name
        user.id_card = id_card
    except BaseException as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg=error_map[RET.DBERR])

    return jsonify(errno=RET.OK, errmsg=error_map[RET.OK], data = user.to_auth_info())